#include <iostream>
using namespace std;

// 抽象类
// 纯虚函数——无法实例化出对象
// class Car
//{
// public:
//	virtual void Drive() = 0;
// };
////间接强制了子类重写虚函数，因为不重写的话，子类依旧是抽象类，实例化不出对象
// class Benchi :public Car
//{
// public:
//	virtual void Drive()
//	{
//		cout << "奔驰nb" << endl;
//	}
// };
// int main()
//{
//	//Car c1;
//	Benchi c2;
//
//
//	int i = 1;
//	cout << i;
//	double d = 1.11;
//	cout << d;
//	//自动识别类型，本质这里是函数重载
//
//	return 0;
// }

// 虚表中存在的是虚函数的地址，满足多态调用的时候，运行时到指向的对象中找到对应的虚函数

// 看板书，几个模型。  普通调用，函数地址是编译时确定的

// 4.3 动态、静态调用

// 5.
// 内存这里怎么看的 听不懂
// class Base
//{
// public:
//	 virtual void Func1()
//	{
//		cout << "Base:func1()";
//	}
// private:
//	int _b = 1;
//
// };
// class Derive :public Base
//{
// public:
//	virtual void Func1()
//	{
//		cout << "Derive::Func1()" << endl;
//	}
//	virtual void Func3()
//	{
//		cout<<"Derive::Func3()" << endl;
//	}
// private:
//	int _d = 2;
// };

// int main()
//{
//	//Base b;
//	//Derive d;
//	//int i = 0;
//	//static int j = 1;
//	//int* p1 = new int;
//	//const char* p2 = "xxxxxx";
//	//printf("栈：%p\n", &i);
//	//printf("静态区：%p\n", &j);
//	//printf("堆：%p\n", p1);
//	//printf("常量区：%p\n", p2);
//
//	//Base* p3 = &b;
//	//Derive* p4 = &d;
//	//printf("Base虚表地址：%p\n", *(int*)p3);
//	//printf("Drive虚表地址：%p\n", *(int*)p4);
//	////p4 是一个 Derive* 类型指针，指向 Derive 对象的起始地址。
//	////在对象的内存布局中，虚函数表指针通常存储在对象的首地址处。
//	////将 p4 转换为 int* （假设指针的大小为 4 字节），表示将指针 p4 当作一个整型指针来看待，这样就可以直接访问对象内存的前 4 字节（虚函数表指针）。
//	////通过 * (int*)p4，你可以解引用该整型指针，获取该对象的虚函数表指针的地址。
//
//
//
//
//
//	return 0;
// }

// class Base1 {
// public:
//	virtual void func1() { cout << "Base1::func1" << endl; }
//	virtual void func2() { cout << "Base1::func2" << endl; }
// private:
//	int b1;
// };
//
// class Base2 {
// public:
//	virtual void func1() { cout << "Base2::func1" << endl; }
//	virtual void func2() { cout << "Base2::func2" << endl; }
// private:
//	int b2;
// };
//
// class Derive : public Base1, public Base2 {
// public:
//	virtual void func1() { cout << "Derive::func1" << endl; }
//	virtual void func3() { cout << "Derive::func3" << endl; }
// private:
//	int d1;
// };
// func3放在Base1里面，第一个里面

class Base
{
public:
    virtual void Func1()
    {
        cout << "Base::Func1()" << endl;
    }
    virtual void Func2()
    {
        cout << "Base::Func2()" << endl;
    }
    void Func3()
    {
        cout << "Base::Func3()" << endl;
    }

private:
    int _b = 1;
    char _ch;
};

class Derive : public Base
{
public:
    virtual void Func1()
    {
        cout << "Derive::Func1()" << endl;
    }
    void Func3()
    {
        cout << "Derive::Func3()" << endl;
    }

private:
    int _d = 2;
};

int main()
{
    Base b;
    Derive d;
    // 普通调用——编译时/静态 绑定
    Base *ptr = &b;
    ptr->Func3();
    ptr = &d;
    ptr->Func3();
    // 多态调用——运行时/动态 绑定
    ptr = &b;
    ptr->Func1();
    ptr = &d;
    ptr->Func1();
    return 0;
}

// class Base {
// public:
//	virtual void func1() { cout << "Base::func1" << endl; }
//	virtual void func2() { cout << "Base::func2" << endl; }
// private:
//	int a = 1;
// };
//
// class Derive :public Base {
// public:
//	virtual void func1() { cout << "Derive::func1" << endl; }
//	virtual void func3() { cout << "Derive::func3" << endl; }
//	virtual void func4() { cout << "Derive::func4" << endl; }
// private:
//	int b = 2;
// };
// int main()
//{
//	Base b;
//	Derive d;
//	return 0;
// }